package com.smh.a04SetDemo1;

public class HashSetDemo1 {
    public static void main(String[] args) {

        /*
        * 哈希值
        根据hashCode方法算出来的int类型的整数
        该方法定义在Object类中，所有对象都可以调用，默认使用地址值进行计算一般情况下，会重写hashCode方法，利用对象内部的属性值计算哈希值
        对象的哈希值特点
        如果没有重写hashCode方法，不同对象计算出的哈希值是不同的
        如果已经重写hashcode方法，不同的对象只要属性值相同，计算出的哈希值就是一样的
        * 哈希碰撞有可能发生 及哈希值有可能相同<小部分情况>
        * * */
        Student student = new Student("asd",12,"nan");
        Student student2 = new Student("zxc",12,"nv");
        Student student3 = new Student("qwe",12,"nan");
        Student student4 = new Student("qwe",12,"nan");

        System.out.println(student2.hashCode());
        System.out.println(student3.hashCode());
        System.out.println(student4.hashCode());

        //哈希碰撞
        System.out.println("abc".hashCode());
        System.out.println("acD".hashCode());

       /* HashSet底层原理
                HashSet集合底层采取哈希表存储数据
                哈希表是一种对于增删改查数据性能都较好的结构
        哈希表组成
        JDK8之前:数组+链表
        JDK8开始:数组+链表+红黑树*/

        /*创建一个默认长度16，默认加载因为0.75的数组，数组名table根据元素的哈希值跟数组的长度计算出应存入的位置
        判断当前位置是否为null，如果是null直接存入
        如果位置不为null，表示有元素，则调用equals方法比较属性值
        一样:不存
        不一样:存入数组，形成链表
        JDK8以前:新元素存入数组，老元素挂在新元素下面   JDK8以后∶新元素直接挂在老元素下面
        */
//        JDK8以后，当链表长度超过8，而且数组长度大于等于64时，自动转换为红黑树
//        如果集合中存储的是自定义对象，必须要重韦hashCode和equals方法



    }
}
